<?php
/** 
 * @access public
 * @author Marcos Vinicius Pereira dos Santos, <marcos@eagletecnologia.com>
 * @version 1.0
 * @package PHPJasperReport
 *
 * @todo Falta implementar formatação de números negativos e exponenciação.
 */
class Pattern {   

    /**     
     * @access public
     * @return void
     */
    public function Pattern() {
        
    }

    /**    
     * @access public    
     * @param  String $num
     * @param  String $pattern
     * @return String
     */
    public function numberFormat($num,$pattern) {
        $returnValue = $num;
      
        if(!empty ($pattern)){

            //O número é multiplicado por 100 e exibido em porcentagem.
            if(strpos($pattern,'%')){
                $returnValue = $this->realNumberFormat($num*100,substr($pattern,0,-2))." %";

            //O número é multiplicado por 1000 e o resultado é mostrado em milhar.
            }elseif(strpos($pattern,'‰')){
                $returnValue = $this->realNumberFormat($num*1000,substr($pattern,0,-4))." %";

            //Formato de moeda.
            }elseif(strpos($pattern,utf8_decode('¤')) == 1){                
                 $returnValue = CURRENCY." ".$this->realNumberFormat($num,substr($pattern,3));

            //Formato de número cientifico.
            }elseif(strpos($pattern,'E')){
                $returnValue = $this->scientificNumberFormat($number, $pattern);

            //Formato de número real.
            }else{
                $returnValue = $this->realNumberFormat($num,$pattern);
            }            
        }        

        return $returnValue;
    }

    /**
     * @access private
     * @param  String $num
     * @param  String $pattern
     * @return String
     * 
     * @todo   Falta ser implementado a formatação de números negativos.
     */
    private function realNumberFormat($num,$pattern){
        $aux = explode(".",$pattern);
 
        //Verificando se no padrao foi solicitado separador de milhar.
        if(strpos($pattern,',') === false){
            $num = number_format(doubleval($num),strlen($aux[1]),DEC_POINT,'');
        }else{
            $num = number_format(doubleval($num),strlen($aux[1]),DEC_POINT,THOUSANDS_SEP);
        }

        return $num;
    }

    /**    
     * @access public     
     * @param  String date
     * @param  String pattern
     * @return String
     */
    public function dateFormat($date,$pattern){
        $returnValue = $date;
       
        if($pattern != ""){           
            $dateTime = new DateTime($date);

            $returnValue = $dateTime->format($pattern);
        }      

        return $returnValue;
    }   

    /**    
     * @access public    
     * @param  String $number
     * @param  String $pattern
     * @return String
     */
    private function scientificNumberFormat($number,$pattern){
        $returnValue = null;

        return $returnValue;
    }
}
?>